package cn.iocoder.yudao.module.reading.service.recording;

import cn.iocoder.yudao.module.reading.controller.app.recording.vo.RecordingCreateReqVO;
import cn.iocoder.yudao.module.reading.controller.app.recording.vo.RecordingRespVO;
import cn.iocoder.yudao.module.reading.controller.app.recording.vo.RecordingUploadReqVO;
import cn.iocoder.yudao.module.reading.controller.app.recording.vo.RecordingUploadRespVO;
import cn.iocoder.yudao.module.reading.dal.dataobject.recording.UserRecordingDO;

import java.util.List;

/**
 * 配音管理 Service 接口
 *
 * @author 芋道源码
 */
public interface RecordingService {

    /**
     * 上传录音文件
     *
     * @param userId      用户ID
     * @param uploadReqVO 上传信息
     * @return 上传结果
     */
    RecordingUploadRespVO uploadRecording(Long userId, RecordingUploadReqVO uploadReqVO);

    /**
     * 创建配音记录
     *
     * @param userId      用户ID
     * @param createReqVO 创建信息
     * @return 配音记录ID
     */
    Long createRecording(Long userId, RecordingCreateReqVO createReqVO);

    /**
     * 更新配音记录
     *
     * @param userId      用户ID
     * @param recordingId 配音记录ID
     * @param updateReqVO 更新信息
     */
    void updateRecording(Long userId, Long recordingId, RecordingCreateReqVO updateReqVO);

    /**
     * 获得配音记录
     *
     * @param id 编号
     * @return 配音记录
     */
    UserRecordingDO getRecording(Long id);

    /**
     * 获得配音记录详情
     *
     * @param userId      用户ID
     * @param recordingId 配音记录ID
     * @return 配音记录详情
     */
    RecordingRespVO getRecordingDetail(Long userId, Long recordingId);

    /**
     * 获得用户配音记录列表
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 配音记录列表
     */
    List<RecordingRespVO> getUserRecordings(Long userId, Integer limit);

    /**
     * 获得绘本的用户配音记录
     *
     * @param userId 用户ID
     * @param bookId 绘本ID
     * @return 配音记录列表
     */
    List<RecordingRespVO> getBookRecordings(Long userId, Long bookId);

    /**
     * 获得页面的用户配音记录
     *
     * @param userId 用户ID
     * @param pageId 页面ID
     * @return 配音记录
     */
    RecordingRespVO getPageRecording(Long userId, Long pageId);

    /**
     * 获得配音记录列表
     *
     * @param bookId 绘本ID（可选）
     * @param limit  限制数量
     * @return 配音记录列表
     */
    List<RecordingRespVO> getRecordings(Long bookId, Integer limit);

    /**
     * 删除配音记录
     *
     * @param userId      用户ID
     * @param recordingId 配音记录ID
     */
    void deleteRecording(Long userId, Long recordingId);

    /**
     * 统计用户配音数量
     *
     * @param userId 用户ID
     * @return 配音数量
     */
    Long countUserRecordings(Long userId);

    /**
     * 根据绘本ID和页码获取页面ID
     *
     * @param bookId     绘本ID
     * @param pageNumber 页码
     * @return 页面ID
     */
    Long getPageIdByBookIdAndPageNumber(Long bookId, Integer pageNumber);

    /**
     * 检查用户在指定页面是否已有录音
     *
     * @param userId 用户ID
     * @param pageId 页面ID
     * @return 是否已有录音
     */
    boolean hasExistingRecording(Long userId, Long pageId);

}
